package com.example.coupon.executor.impl;

import com.example.coupon.constant.RuleFlag;
import com.example.coupon.executor.AbstractExecutor;
import com.example.coupon.executor.RuleExecutor;
import com.example.coupon.vo.CouponTemplateSDK;
import com.example.coupon.vo.SettlementInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Collections;

/**
 * 满减优惠券结算规则执行器
 *
 * @author wangbo
 * @description:
 * @date 2021/2/2011:21
 */
@Slf4j
@Component
public class ManJianExecutor extends AbstractExecutor implements RuleExecutor {

    @Override
    public RuleFlag ruleConfig() {
        return RuleFlag.MANJIAN;
    }

    @Override
    public SettlementInfo computeRule(SettlementInfo settlement) {
        double goodsSum = retain2Decimals(goodsCostSum(settlement.getGoodsInfos()));
        SettlementInfo probability = processGoodsTypeNotSatisfy(settlement, goodsSum);
        if (probability != null) {
            log.debug("ManJian Template Is Not Match To GoodsType!");
            return probability;
        }

        //判断满减是否符合折扣标准
        CouponTemplateSDK templateSDK = settlement.getCouponAndTemplateInfos().get(0).getTemplate();
        double base = (double) templateSDK.getTemplateRule().getDiscount().getBase();
        double quota = (double) templateSDK.getTemplateRule().getDiscount().getQuota();
        //如果不符合标准，则直接返回商品总价
        if (goodsSum < base) {
            log.debug("Current Goods Cost Sum < ManJian Coupon Base!");
            settlement.setCost(goodsSum);
            settlement.setCouponAndTemplateInfos(Collections.emptyList());
            return settlement;
        }

        //计算使用优惠券之后的价格
        settlement.setCost(retain2Decimals(goodsSum - quota) > minCost() ? (goodsSum - quota):minCost());
        log.debug("Use ManJian Coupon Make Goods Cost From {} To {}",goodsSum,settlement.getCost());
        return settlement;
    }
}
